import "./assets/main.css";
import { createApp } from "vue";
import { createPinia } from "pinia";
import App from "./App.vue";
import router from "./router";
import ElementPlus, { ElMention, ElMessage } from "element-plus";
import "element-plus/dist/index.css";
import zhCn from "element-plus/es/locale/lang/zh-cn";
import piniaPluginPersistedstate from "pinia-plugin-persistedstate";
axios.defaults.baseURL = "http://localhost:5196";
//#region   API请求配置
import axios from "axios"; //引入axios
import { useCounterStore } from "./stores/counter";
import { useRouter } from "vue-router";

// 添加请求拦截器
axios.interceptors.request.use(
  function (config) {
    var demo = useCounterStore(); //仓库实例
    // 在发送请求之前做些什么
    var token = demo.userinfo.AccountToken;
    config.headers.Authorization = "Bearer " + token; //每次请求后端数据都配置头部Token
    return config;
  },

  function (error) {
    // 检查是否存在响应对象且状态码为401（未授权，表示Token过期）
    if (error.response.status === 401) {
      alert("终于过期了");
      // 获取原始请求配置，用于后续重试操作
      const Configrequestwayt = error.config;

      // _retry标志用于防止同一次请求重复进入Token刷新流程，避免无限循环
      if (!Configrequestwayt._retry) {
        // 标记该请求正在进行Token刷新处理
        Configrequestwayt._retry = true;

        // 获取Pinia存储实例，用于访问和更新用户Token信息
        var demo = useCounterStore();

        /**
         * Token刷新流程
         * 1. 调用RefreshToken接口获取新的短期Token
         * 2. 使用用户存储中的RefreshToken作为刷新凭证
         * 3. 处理刷新结果，包括更新Token和重试请求或跳转到登录页
         */
        return axios
          .post("/api/Users/RefreshToken", {
            // 注意：参数名与API文档保持一致
            RefreshToken: demo.userinfo.RefreshToken,
          })
          .then((res) => {
            // 调试日志：记录刷新Token的返回结果
            console.log("Token刷新结果:", res.data);

            // 判断刷新是否成功 - API返回特定错误消息表示RefreshToken已过期
            if (
              res.data === "Token已过期,请用户重新登录,马上为您跳转到登录页面"
            ) {
              // 刷新失败：通知用户并跳转到登录页面
              ElMessage.error(res.data);
              var router = useRouter();
              router.push("/");
              return Promise.reject(error);
            } else {
              /**
               * Token刷新成功后的处理流程：
               * 1. 更新Pinia存储中的短期Token
               * 2. 更新axios全局默认请求头
               * 3. 更新原始请求的Authorization头
               * 4. 重新发起原始请求
               */

              // 更新存储中的短期Token（AccountToken）
              demo.userinfo.AccountToken = res.data;

              // 更新axios全局默认Authorization头，影响后续所有请求
              axios.defaults.headers.common["Authorization"] =
                "Bearer " + demo.userinfo.AccountToken;

              // 更新原始请求的Authorization头，确保重试时使用新Token
              Configrequestwayt.headers.Authorization =
                "Bearer " + demo.userinfo.AccountToken;

              // 提示用户Token已成功刷新
              ElMessage.success("后台刷新了Token");

              // 重新发起失败的原始请求，使用新的Token
              return axios(Configrequestwayt);
            }
          })
          .catch((refreshError) => {
            /**
             * Token刷新请求本身失败的处理
             * 可能原因：网络问题、服务器错误、RefreshToken无效等
             */
            ElMessage.error("Token刷新失败");
            var router = useRouter();
            // 刷新请求失败时，强制用户重新登录
            router.push("/");
            return Promise.reject(refreshError);
          });
      }
      // 注意：如果请求已经在刷新处理中(_retry为true)，将直接拒绝，避免重复刷新
    }
    // 非401错误或Token刷新失败的情况，直接拒绝并传递原始错误
    return Promise.reject(error);
  }
);

//#endregion

const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);
const app = createApp(App);
app.use(ElementPlus, {
  locale: zhCn,
});
app.use(pinia);
app.use(router);
app.mount("#app");
